package main

import "fmt"

func main() {
	var a string = "hello"
	fmt.Println(a)
	var b, c int = 1, 2
	fmt.Println(b, c)

	var d int
	fmt.Println(d) // 0

	var c1 bool
	fmt.Println(c1) // false

	var e *int
	fmt.Println(e) // nil

	var e1 []int
	fmt.Println(e1) // nil

	var a0 chan int // chan channel go中的管道, 见21channel.go demo
	fmt.Println(a0) // nil

	var a1 func(string) int
	fmt.Println(a1) // nil

	var a2 error    // error is interface
	fmt.Println(a2) // nil

	var f float64
	fmt.Println(f) // 0

	var h int
	var b1 bool = true
	var s = "what"
	fmt.Printf("%v %v %v %q\n", h, b1, f, s)

	// var 声明赋值的简写，不可用于已声明变量的赋值
	some := 100 // := 是声明赋值语句，如果已经var声明了再使用:=，编译不通过
	fmt.Println(some)

	var ( // 该种声明方式一般用于全局声明, 变量声明不使用报错
		aa int
		bb bool
	)

	var x, y = 123, "aaa"
	println(x, y, aa, bb)

	println(&x) // x的地址

	// 当对于函数返回多值，存在不需要的值时，可以直接抛弃，使用抛弃只写变量_
	var xx int
	_, xx = 123, 345 // 123将被抛弃
	println(xx)

	_, m, n := num()
	println(m, n)
}

func num() (int, int, string) {
	a, b, c := 1, 2, "str"
	return a, b, c
}
